﻿using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Xml;
using System.Xml.Xsl;
using ConexionDIGERCICPrueba.rcDIGERCICws;



namespace ConexionDIGERCICPrueba
{
    public partial class _Default : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {

        }
        //--- FUNCION PARA TRANSFORMACION DE XML EN HTML A TRAVES DE XSL
        public static string TransformXMLToHTML(string inputXml, string xsltString)
        {
            XslCompiledTransform transform = new XslCompiledTransform();
            using (XmlReader reader = XmlReader.Create(new StringReader(xsltString)))
            {
                transform.Load(reader);
            }
            StringWriter results = new StringWriter();
            using (XmlReader reader = XmlReader.Create(new StringReader(inputXml)))
            {
                transform.Transform(reader, null, results);
            }
            return results.ToString();
        }
        public static bool ValidateCedula(string _cedula)
        {
            int _provincias = 24;
            /**
            * Este método permite verificar si una cédula de identidad es verdadera
            * retorna true si es válida, caso contrario retorna false.
            * @param cedula Cédula de Identidad Ecuatoriana de 10 digitos.
            * @return Si es verdadera true, si es falsa false
            */
            //verifica que tenga 10 dígitos y que contenga solo valores numéricos
            if (!(_cedula.Length == 10 && Regex.IsMatch(_cedula, "^[0-9]{10}$")))
            {
                return false;
            }

            //verifica que los dos primeros dígitos correspondan a un valor entre 1 y NUMERO_DE_PROVINCIAS
            int _provincia = int.Parse(_cedula.Substring(0, 2));

            if (!((_provincia > 0) && (_provincia <= _provincias)))
            {
                return false;
            }

            //verifica que el último dígito de la cédula sea válido
            int[] _digito = new int[10];

            //Asignamos el string a un array
            for (int i = 0; i < _digito.Length; i++)
            {
                _digito[i] = int.Parse(_cedula[i] + "");
            }

            int _impar = 0;
            int _par = 0;

            //sumamos los duplos de posición impar
            for (int i = 0; i < _digito.Length; i += 2)
            {
                _digito[i] = ((_digito[i] * 2) > 9) ? ((_digito[i] * 2) - 9) : (_digito[i] * 2);
                _impar += _digito[i];
            }

            //sumamos los digitos de posición par
            for (int i = 1; i < (_digito.Length - 1); i += 2)
            {
                _par += _digito[i];
            }

            //Sumamos los dos resultados
            int _suma = _impar + _par;

            //Restamos de la decena superior
            int _digito10 = int.Parse(Convert.ToString(_suma + 10).Substring(0, 1) + "0") - _suma;

            //Si es diez el décimo dígito es cero        
            _digito10 = (_digito10 == 10) ? 0 : _digito10;

            //si el décimo dígito calculado es igual al digitado la cédula es correcta
            return _digito10 == _digito[9];
        }

        protected void Comprobar_Click(object sender, EventArgs e)
        {
            //se vacía el campo de mensaje
            RespuestaWS.Text = "";
            //se dispara la validación de cédula
            if (!(ValidateCedula(Cedula.Text)))
            {
                RespuestaWS.Text = "<p class=\"error\">Cédula Incorrecta, por favor inténtelo nuevamente</p>";
            }
            else
            {
                //después de revisar las excepciones en las Opciones de internet de la máquina (hay que ingluir el dominio del WS) se grega esta línea de código. Acá la explicación: http://silverbling.blogspot.com/2009/05/oh-noes-expectation-failed-417-in-my.html
                System.Net.ServicePointManager.Expect100Continue = false;

                //validacion del usuario y cédula
                string _cedula = Cedula.Text;
                string _usuario = "eepg1";
                string _contrasena = "3EpG$";

                WS_EEPG_BCEDULA_INTDB_DES_RUNPortTypeClient _job_movi = new WS_EEPG_BCEDULA_INTDB_DES_RUNPortTypeClient();
                string[] _args = { _cedula, _usuario, _contrasena };
                _args[0] = "--context_param p_macedu=" + _cedula;
                _args[1] = "--context_param p_usuario=" + _usuario;
                _args[2] = "--context_param p_contrasenia=" + _contrasena;
                string[][] _respuesta = _job_movi.runJob(_args);

                string _xlsresultado = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>";
                _xlsresultado += "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns:foo=\"http://www.foo.org/\" xmlns:bar=\"http://www.bar.org\">";
                _xlsresultado += "<xsl:template match=\"/\"><h2>Datos del Ciudadano</h2><table border=\"1\"><tr><th>Cedula</th><th>Nombre</th><th>Condicion</th><th>Nacionalidad</th><th>Estado Civil</th><th>Conyuge</th><th>Defuncion</th><th>Instruccion</th><th>Profesion</th></tr>";
                _xlsresultado += "<xsl:for-each select=\"ROWSET/ROW\"><tr><td><xsl:value-of select=\"CEDULA\"/></td><td><xsl:value-of select=\"NOMBRE\"/></td><td><xsl:value-of select=\"CONDICION_CEDULADO\"/></td><td><xsl:value-of select=\"FECHA_NACIMIENTO\"/></td><td><xsl:value-of select=\"ESTADO_CIVIL\"/></td><td><xsl:value-of select=\"CONYUGE\"/></td><td><xsl:value-of select=\"FECHA_DEFUNCION\"/></td><td><xsl:value-of select=\"INSTRUCCION\"/></td><td><xsl:value-of select=\"PROFESION\"/></td></tr></xsl:for-each></table></xsl:template></xsl:stylesheet>";

                //TODO Validación de las respuestas de error del Web Service del DIGERCIC
                RespuestaWS.Text = TransformXMLToHTML(_respuesta[0][0], _xlsresultado);


                //RespuestaWS.Text = _respuesta[0][0];
            }
        }
    }
}
